class Solution {
    public:
        int maxUncrossedLines(vector<int>& nums1, vector<int>& nums2) {
            int m = nums1.size(),n = nums2.size();
            vector<vector<int>> dp(m+1,vector<int>(n+1));
            //dp[i][j] 表示nums1中0-i的子序列与nums2中0-j的子序列 公共子序列的最长长度
            //状态转移方程按照 nums1[i] == nums2[j] 还是!=
            for(int i = 1 ; i < m+1 ; i++){
                for(int j =1 ; j < n+1 ; j++ ){
                    if(nums1[i-1] == nums2[j-1]){
                        dp[i][j] = dp[i-1][j-1]+1;
                    }else{
                        dp[i][j] = max({dp[i-1][j],dp[i][j-1],dp[i-1][j-1]});
                    }
               }
            }
            return dp[m][n];
        }
    };